package org.bouncycastle.math.ec;

import java.math.BigInteger;

/**
 * Class implementing the NAF (Non-Adjacent Form) multiplication algorithm.
 */
class FpNafMultiplier implements ECMultiplier {
	/**
	 * D.3.2 pg 101
	 * 
	 * @see ECMultiplier#multiply(ECPoint, BigInteger, PreCompInfo)
	 */
	public ECPoint multiply(ECPoint p, BigInteger k, PreCompInfo preCompInfo) {
		// Probably should try to add this
		// BigInteger e = k.mod(n); // n == order of p
		BigInteger e = k;
		BigInteger h = e.multiply(BigInteger.valueOf(3));

		ECPoint neg = p.negate();
		ECPoint R = p;

		for (int i = h.bitLength() - 2; i > 0; --i) {
			R = R.twice();

			boolean hBit = h.testBit(i);
			boolean eBit = e.testBit(i);

			if (hBit != eBit) {
				R = R.add(hBit ? p : neg);
			}
		}

		return R;
	}
}
